home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / HDX_BACK / SHOWFILE / GETARGS.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-09  |  3.0 KB  |  120 lines

  1. /*
  2.  * getargs: interpret either MWC args or command-line args (if no MWC).
  3.  *
  4.  * USAGE:
  5.  *    main(argc,argv)
  6.  *    int argc;
  7.  *    char *argv[];
  8.  *    {
  9.  *        getargs(&argc,&argv);
  10.  *        ... now process the args and run the program ...
  11.  *    }
  12.  *
  13.  * Allows a max of NARGV arguments: normally 128 is sufficient.
  14.  *
  15.  * Call with *(&argc) != 0 if somebody has already parsed the command-
  16.  * line arguments for you; in that case, if there aren't any
  17.  * args in the environment, this procedure just returns
  18.  * because the previous parser has already done its best. 
  19.  *
  20.  * Requires getenv().
  21.  *
  22.  * Clobbers the environment so children started from here will not
  23.  * see ARGV= in their env (unless it's put there later).  This also
  24.  * means you can't call getargs twice...
  25.  *
  26.  * Interprets the environment string like MWC does.
  27.  *
  28.  * Does not validate the ARGV string.  This is a bug.  The convention
  29.  * which has developed means that all programs which launch children
  30.  * must use the ARGV convention, or none may, because if one which does
  31.  * use it launches one which doesn't, which launches one which does,
  32.  * then the last one will see the middle one's ARGV.
  33.  */
  34.  
  35. static char argcopy[128];
  36.  
  37. #define NARGV 128
  38. static char *argv[NARGV];
  39.  
  40. getargs(p_argc,p_argv)
  41. int *p_argc;
  42. char ***p_argv;
  43. {
  44.     extern char *_base;
  45.     char *getenv();
  46.     register char *eptr;
  47.     register int count = 0;
  48.     char hold;
  49.  
  50.     if (eptr = getenv("ARGV")) {
  51.     eptr += strlen(eptr) + 1;
  52.     while (count < NARGV-1 && *eptr) {
  53.         argv[count++] = eptr;
  54.         eptr += strlen(eptr) + 1;
  55.     }
  56.  
  57.     /* clobber "ARGV=" so environment ends there,    */
  58.     /* so children won't see these args in the env.    */
  59.  
  60.     eptr = getenv("ARGV");
  61.     while (*(--eptr) != 'A') ;
  62.     *eptr = 0;
  63.     }
  64.     else {
  65.     /* if we've already got args, don't do anything! */
  66.         if (*p_argc != 0) return *p_argc;
  67.     count = *(_base+0x80);
  68.     *(_base+0x81+count) = 0;
  69.     strcpy(argcopy,_base+0x81);
  70.     eptr = argcopy;
  71.     argv[0] = "runtime";
  72.     count = 1;
  73.     while (1) {
  74.         while (*eptr == ' ') eptr++;    /* skip leading spaces */
  75.         if (!*eptr) break;            /* if end, quit */
  76.         argv[count++] = eptr;        /* not end: next arg */
  77.         while (*eptr && *eptr != ' ') eptr++;   /* skip nonwhite */
  78.         hold = *eptr;            /* save old value */
  79.         *eptr = 0;                /* null terminate */
  80.         if (!hold) break;            /* if old was null, end */
  81.         else eptr++;            /* else increment & loop */
  82.     }
  83.     }
  84.     argv[count] = eptr;
  85.     *p_argv = &argv[0];
  86.     *p_argc = count;
  87.     return count;
  88. }
  89.  
  90.  
  91. /*
  92.  * getenv: get the value of an environment string parameter
  93.  */
  94.  
  95. char *getenv(s)
  96. char *s;
  97. {
  98.     extern long *_base;        /* set by gemstart */
  99.     char *p;
  100.     char *start;
  101.     int temp;
  102.  
  103.     p = _base[11];
  104.     while (*p) {
  105.     for (start=p ; *p && *p != '='; p++);
  106.     if (*p) {
  107.         *p = '\0';
  108.         temp = strcmp(start,s);
  109.         *p = '=';
  110.         if (temp == 0) {
  111.         return ++p;
  112.         }
  113.         while (*p) p++;    /* no match; skip to next */
  114.     }
  115.     p++;
  116.     }
  117.     return 0L;
  118. }
  119.  
  120.